@@ -141,7 +141,17 @@ module LiquidInterpolatable |
||
| 141 | 141 |
# occurs while following redirects, the last URL followed is |
| 142 | 142 |
# returned. |
| 143 | 143 |
def uri_expand(url, limit = 5) |
| 144 |
- uri = URI(url) |
|
| 144 |
+ case url |
|
| 145 |
+ when URI |
|
| 146 |
+ uri = url |
|
| 147 |
+ else |
|
| 148 |
+ url = url.to_s |
|
| 149 |
+ begin |
|
| 150 |
+ uri = URI(url) |
|
| 151 |
+ rescue URI::Error |
|
| 152 |
+ return url |
|
| 153 |
+ end |
|
| 154 |
+ end |
|
| 145 | 155 |
|
| 146 | 156 |
http = Faraday.new do |builder| |
| 147 | 157 |
builder.adapter :net_http |
@@ -153,6 +163,7 @@ module LiquidInterpolatable |
||
| 153 | 163 |
begin |
| 154 | 164 |
case uri |
| 155 | 165 |
when URI::HTTP |
| 166 |
+ return uri.to_s unless uri.host |
|
| 156 | 167 |
response = http.head(uri) |
| 157 | 168 |
case response.status |
| 158 | 169 |
when 301, 302, 303, 307 |
@@ -116,6 +116,18 @@ describe LiquidInterpolatable::Filters do |
||
| 116 | 116 |
to_return(status: 301, headers: { 'Content-Length' => '5' })
|
| 117 | 117 |
end |
| 118 | 118 |
|
| 119 |
+ it 'should handle inaccessible URIs' do |
|
| 120 |
+ expect(@filter.uri_expand(nil)).to eq('')
|
|
| 121 |
+ expect(@filter.uri_expand('')).to eq('')
|
|
| 122 |
+ expect(@filter.uri_expand(5)).to eq('5')
|
|
| 123 |
+ expect(@filter.uri_expand([])).to eq('[]')
|
|
| 124 |
+ expect(@filter.uri_expand({})).to eq('{}')
|
|
| 125 |
+ expect(@filter.uri_expand(URI('/'))).to eq('/')
|
|
| 126 |
+ expect(@filter.uri_expand(URI('http:google.com'))).to eq('http:google.com')
|
|
| 127 |
+ expect(@filter.uri_expand(URI('http:/google.com'))).to eq('http:/google.com')
|
|
| 128 |
+ expect(@filter.uri_expand(URI('ftp://ftp.freebsd.org/pub/FreeBSD/README.TXT'))).to eq('ftp://ftp.freebsd.org/pub/FreeBSD/README.TXT')
|
|
| 129 |
+ end |
|
| 130 |
+ |
|
| 119 | 131 |
it 'should follow redirects' do |
| 120 | 132 |
expect(@filter.uri_expand('https://t.co.x/aaaa')).to eq('http://www.example.com/welcome')
|
| 121 | 133 |
end |